Date		:	30/9/93
		Protection	:	MOT DE PASSE
		Programme	:       MEGALOMANIA
		Outils		:	SOFT-ICE V2.50
		Fichier		:	M.EXE
		Temps pass�	:	15mn
		Soci�t�		:	Sensible software
		Origine		:	Freddy
		Divers	        :	Cr�ation d'un lanceur
		Num�ro		:	5


	  Ce programme (comme le montre le temps pass�) n'�tait pas bien
	difficile � cracker, la seule difficult� �tant que le programme �tait
	comprim� fa�on maison, c-a-d undecryptable. Seulement, il y a une
	parade, celle d'utiliser le (fameux) lanceur de mon paternel.
	  Voici ce qui se passe : on teste la r�ponse, si celle-ci est mauvaise
	on permet un second essai puis on quitte. La m�thode classique consiste
	� inverser le saut qui r�agit en fonction de la r�ponse, ou � le forcer.
	Ici (avec le lanceur), je l'inverse :

		1E22:5333 7511		JNZ 5346	---> devient JZ 5346

	Ci-dessous, le lanceur en question :


;       PATCH POUR LE PROGRAMME MEGALOMANIA
;
;******************************************************************************
;                             ZONE A INITIALISER

adr_ip1         equ     05333h  ; Adresse dont le contenu est � modifier.

anc_val         equ     01175h  ; Valeur d'origine � rechercher, invers�e.
				
nouv_val        equ     01174h  ; Nouvelle valeur (la modif).

INT_DET         equ     21h     ; Le num�ro de l'INT que l'on veut utiliser.
BEEP_TONE       equ     440     ; Fr�quence de la note.

;******************************************************************************
seg_a           segment byte public

		assume  cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a
  
		org     100h

sto             proc    far

start:
		jmp     init            ; r�duire la m�moire et d�placer la 
		db      90h             ; pile plus pr�s.
paramet         dw      0               ; M�me bloc d'environnement.            
ENVIR           dw      0               ; Les param�tres de la ligne de 
data_3          dw      0               ; commande sont recopi�s ici puis
FCB_1           dw      0               ; transmis au programme fils. ( 80h )
data_5          dw      0               
FCB_2           dw      0
data_7          dw      0
sauve_SP        dw      0
sauve_SS        dw      0
data_9          dw      0, 0
drap            equ     0

;------------------------------ PROGRAMME PERE ------------------------------

loc_1:          mov     sauve_SP,sp
		mov     sauve_SS,ss
		mov     ax,80h
		mov     ENVIR,ax        ; Ligne de commande...
		mov     data_3,ds
		mov     ax,5Ch          ; Premier FCB ( inutilis� )
		mov     FCB_1,ax
		mov     data_5,ds
		mov     ax,6Ch          ; Second FCB ( inutilis� )
		mov     FCB_2,ax
		mov     data_7,ds
		mov     ah,35h  
		mov     al,INT_DET
		int     21h             ; DOS Services  ah=function 35h
					;  get intrpt vector al in es:bx
		mov     cs:data_9,bx
		mov     word ptr cs:data_9+2,es
		mov     ah,25h          
		mov     al,INT_DET              
		lea     dx,cs:[_int]    ; Load effective addr
		int     21h             ; DOS Services  ah=function 25h
					;  set intrpt vector al to ds:dx
		lea     dx,cs:[nom_prg] ; Load effective addr
		push    ds
		pop     es
		lea     bx,cs:[paramet] ; Load effective addr
		mov     al,0
		mov     ah,4Bh          
		int     21h             ; Appel du programme fils.
					; run progm @ds:dx, parm @es:bx
		mov     sp,sauve_SP     
		mov     ss,sauve_SS     
		cmp     al,2            ; teste le code de retour du programme
		jnz     ok              ; fils, 02 si pas trouv�.
		mov     dx,offset mess_err      
		mov     ah,9
		int     21h

	; Les cinq instructions suivantes sont facultatives puisque le
	; vecteur d'origine est remis en place d�s que le patch est effectu�.
	; Le seul but est d'�viter le plantage du PC dans l'hypoth�se o� l'on
	; lance le programme p�re et que celui-ci ne trouve pas le programme
	; fils. A ce moment l� on remet tout en place et on quitte.

ok:             mov     ah,25h
		mov     al,INT_DET
		mov     dx,cs:data_9
		mov     ds,word ptr cs:data_9+2
		int     21h             

		mov     ah,4Ch
		int     21h             ;  terminate with al=return code
sto             endp

;---------------------------- int d�tourn�e --------------------------------

int_entry       proc    far
_int:           jmp     apres
_SAUVE_SP	dw      0,0
apres:	        push    ax
		push    ds
		push    bx
		push    cx
		push    dx
		pushf                           ; Push flags
		mov     word ptr cs:[_SAUVE_SP],sp
		mov     cx,30
prochain:       pop     ds
		dec     cx
		jz      s                      
		cmp     word ptr ds:[adr_ip1],anc_val   ; Si ok on patche.
		jnz     prochain
		mov     word ptr ds:[adr_ip1],nouv_val  ; On y place le patch.
		xor     bx,bx
		mov     ds,bx                   

	; L'INT 21 n'est pas r�entrante, on ne peut donc pas se servir de
	; la fonction 25h ( set int. vector )   
	
		mov     bx,word ptr cs:data_9      ; Je remets manuellement
		mov     ds:[INT_DET*4],bx          ; en place le vecteur
		mov     bx,word ptr cs:data_9+2    ; de l'INT d�tourn�e.
		mov     ds:[INT_DET*4+2],bx        

;* Sound - Sounds speaker with the following tone and duration:

	mov     al, 0B6h                ; Initialize channel 2 of
	out     43h, al                 ;   timer chip
	mov     dx, 12h                 ; Divide 1,193,180 hertz
	mov     ax, 34DCh               ;   (clock frequency) by
	mov     bx, BEEP_TONE           ;   desired frequency
	div     bx                      ; Result is timer clock count
	out     42h, al                 ; Low byte of count to timer
	mov     al, ah
	out     42h, al                 ; High byte of count to timer
	mov     bx,3                    ; Charge BX avec 3 BEEPs
main_b: in      al, 61h                 ; Read value from port 61h
	or      al, 3                   ; Set first two bits
	out     61h, al                 ; Turn speaker on
	mov     dx,3
rebou:  mov     cx, 0ffffh       
bou:    loopnz  bou
	dec     dx
	jnz     rebou
	in      al, 61h                 ; When time elapses, get port value
	xor     al, 3                   ; Kill bits 0-1 to turn
	out     61h, al                 ;   speaker off
	dec     cx
bou1:   loopnz  bou1
	dec     bx                      ; Compteur de boucle. 
	jnz     main_b                  ; Trois bips...
	
		
s:              mov     sp,word ptr cs:[_SAUVE_SP]
		popf    
		pop     dx
		pop     cx
		pop     bx
		pop     ds                      
		pop     ax
		jmp     dword ptr cs:data_9

int_entry       endp

;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------

init:                                   ; D�codage du texte.
		cld                     ; Pour incr�menter SI et DI.
		xor ax,ax
		mov si,offset chaine    ; pointe sur le d�but de la chaine.
		mov di,si               ; DI �galement.
		mov cx,offset chaine_fin - offset chaine

					; 28 lignes de 6 caract�res sont XOR�s.
					; + mess_err ( 30 ) + nom_prog ( 13 ).
toto:           lodsb                   ; On cherche...
		xor al,ah               ; On XOR.
		stosb                   ; On remet.
		xchg ah,al
		loop toto               ; Et on tourne tant que CX # 0.

		mov ax,1a00h            ; Test si carte + moniteur VGA
		int 10h
		cmp al,1ah
		je  graf            ; Si oui on affiche la fen�tre FREDDY_SOFT.

		mov ah,12h	    ; Test EGA.	INT 10 sf 12 ssf 10
		mov bl,10h
		mov bh,0ffh	    
	        int 10h
		cmp bh,0ffh	    ; Si # de 0ffh on a une carte EGA ou...
		jnz graf	    ; mieux !

suite1:         mov ah,4ah              
		mov bx,offset fin   ; Fin du programme en BX.
		mov cl,4            ; Divis� par 4 pour avoir des paragraphes.  
		shr bx,cl
		inc bx              ; On en rajoute un par s�curit�.    
		int 21h             ; Execution de la fonction 4Ah.
		mov sp,offset fin   ; on d�place la pile en "fin" car elle est
		jmp loc_1           ; plac�e en FFFE dans un programme COM.

graf:           		    ; Raz de l'�cran
		mov ax,3
		int 10h
		mov ax,1301h        ; Mode 01 attribut couleur dans BL. 
		mov bx,004bh        ; Page 0.
		mov cx,28           ; nombre de char.
		mov dx,0a19h        ; ligne,colonne.
		lea bp,cs:[chaine]
ligne_suiv:     int 10h
		inc dh
		add bp,28
		cmp dh,10h              ; 6 lignes de 28 caract�res.
		jb ligne_suiv 
		mov ah,2                ; Pour faire disparaitre le curseur.
		xor bh,bh               ; Page ecran 0.
		mov dh,25
		int 10h
		xor ah,ah
		int 16h                 ; Attend un char...

		mov cx,30
					; Attend le retour ligne...
vibre:		mov dx,3dah
in1:		in al,dx
		test al,8
		jnz in1
in2:		in al,dx
		test al,8
		jz in2
				
		cli			; D�cale d'un pixel.
		mov dx,3c0h
		mov al,33h 
		out dx,al
		mov al,2
		out dx,al
		sti

		mov dx,3dah
in3:		in al,dx
		test al,8
		jnz in3
in4:		in al,dx
		test al,8
		jz in4
				
		cli			; D�cale d'un pixel.
		mov dx,3c0h
		mov al,33h
		out dx,al
		mov al,0ffh
		out dx,al
		sti
		
		dec cx
		jnz vibre

		jmp suite1
		db      55h,0aah        ; Identificateur de d�but.
chaine:         db      '�����������CEDRIC���������Ŀ'
		db      '�                          �'
		db      '�    Megalomania Bypass    �'
		db      "�  I hope you'll enjoy it  �"
		db      '�                          �'
		db      '��� Lan�eur Crypt� V1.1 ����'
mess_err        db      0ah,0dh,'Programme enfant non trouv�','$'
nom_prg         db      'm.exe',0,0,0,0,0,0,0,0   ; 12 car max + nul
chaine_fin:     db      0aah,55h        ; Identificateur de fin.
fin_init        label near

;----------------------- PLACE RESERVEE POUR LA PILE ------------------------

		dw 100 dup (' ')
fin             equ this byte       ; ici le sommet de la pile, SP.
seg_a           ends
		end     start